package com.zenithmind.library.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.common.result.Result;
import com.zenithmind.library.pojo.domain.Reservation;
import com.zenithmind.library.pojo.dto.ReservationCreateDTO;
import com.zenithmind.library.pojo.dto.ReservationUpdateDTO;
import com.zenithmind.library.pojo.query.ReservationQuery;
import com.zenithmind.library.pojo.vo.ReservationVO;

import java.time.LocalDate;
import java.util.List;

/**
 * 预约服务接口
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
public interface ReservationService extends IService<Reservation> {

    /**
     * 创建预约
     * 
     * @param createDTO 创建DTO
     * @return 创建结果
     */
    Result<ReservationVO> createReservation(ReservationCreateDTO createDTO);

    /**
     * 更新预约
     * 
     * @param id 预约ID
     * @param updateDTO 更新DTO
     * @return 更新结果
     */
    Result<ReservationVO> updateReservation(String id, ReservationUpdateDTO updateDTO);

    /**
     * 取消预约
     * 
     * @param id 预约ID
     * @param reason 取消原因
     * @return 取消结果
     */
    Result<Void> cancelReservation(String id, String reason);

    /**
     * 确认取书
     * 
     * @param id 预约ID
     * @return 确认结果
     */
    Result<Void> confirmPickup(String id);

    /**
     * 分页查询预约记录
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<ReservationVO> getReservationPage(ReservationQuery query);

    /**
     * 根据用户查询预约记录
     * 
     * @param userId 用户ID
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<ReservationVO> getReservationsByUser(String userId, ReservationQuery query);

    /**
     * 根据图书查询预约记录
     * 
     * @param bookId 图书ID
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<ReservationVO> getReservationsByBook(String bookId, ReservationQuery query);

    /**
     * 获取用户当前预约记录
     * 
     * @param userId 用户ID
     * @return 预约记录列表
     */
    List<ReservationVO> getCurrentReservationsByUser(String userId);

    /**
     * 获取图书预约队列
     * 
     * @param bookId 图书ID
     * @return 预约记录列表
     */
    List<ReservationVO> getBookReservationQueue(String bookId);

    /**
     * 获取可取书的预约记录
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<ReservationVO> getAvailableReservations(ReservationQuery query);

    /**
     * 获取过期的预约记录
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<ReservationVO> getExpiredReservations(ReservationQuery query);

    /**
     * 检查用户是否可以预约
     * 
     * @param userId 用户ID
     * @param bookId 图书ID
     * @return 检查结果
     */
    Result<Boolean> canUserReserve(String userId, String bookId);

    /**
     * 检查图书是否可以预约
     * 
     * @param bookId 图书ID
     * @return 检查结果
     */
    Result<Boolean> canBookBeReserved(String bookId);

    /**
     * 处理图书归还后的预约通知
     * 
     * @param bookId 图书ID
     * @return 处理结果
     */
    Result<Void> processBookReturnNotification(String bookId);

    /**
     * 发送预约通知
     * 
     * @param reservationId 预约ID
     * @return 发送结果
     */
    Result<Void> sendReservationNotification(String reservationId);

    /**
     * 批量发送预约通知
     * 
     * @return 发送数量
     */
    Result<Integer> batchSendReservationNotifications();

    /**
     * 自动处理过期预约
     * 
     * @return 处理数量
     */
    Result<Integer> autoProcessExpiredReservations();

    /**
     * 获取预约统计信息
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     */
    ReservationVO getReservationStatistics(LocalDate startDate, LocalDate endDate);

    /**
     * 获取热门预约图书
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param limit 限制数量
     * @return 图书列表
     */
    List<ReservationVO> getHotReservedBooks(LocalDate startDate, LocalDate endDate, Integer limit);

    /**
     * 导出预约记录
     * 
     * @param query 查询条件
     * @return 导出文件路径
     */
    Result<String> exportReservations(ReservationQuery query);
}
